/**
 * @file bsp_i2c.h
 * @brief I2C封装驱动
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2020-10-10
 * @copyright Copyright (c) 2020  烽火通信
 */
#ifndef __BSP_I2C_H
#define __BSP_I2C_H 
#include <stdint.h>
#include <stdbool.h>
#include "bsp_gpio.h"
#include "bsp.h"

// #include "FreeRTOS.h"
// #include "task.h"
// #include "semphr.h"

/**
 * @brief I2C外设编号
 */
typedef enum
{
    I2C_1 = 1,
    I2C_2 = 2,
}I2cId_t;

/**
 * @brief I2C从机寄存器地址位数
 */
typedef enum
{
    I2C_ADDR_SIZE_8 = 0,    ///< 寄存器寻址8位
    I2C_ADDR_SIZE_16,       ///< 寄存器寻址16位
}I2cRegAddrSize_t;

/**
 * @brief I2C总线对象结构体
 */
typedef struct I2c_s
{
#ifdef STM32F10X
    I2C_TypeDef *I2Cx;                  ///< I2C库句柄
    I2C_InitTypeDef I2C_InitStructure;
#elif defined GD32F10X
    uint32_t I2Cx;                      ///< I2C外设
#endif
    I2cId_t I2cId;                      ///< I2C外设编号
    bool IsInitialized;                 ///< 外设是否初始化
    I2cRegAddrSize_t I2cRegAddrSize;    ///< 从机寻址地址长度
    Gpio_t Scl;                         ///< 时钟线引脚
    Gpio_t Sda;                         ///< 数据线引脚
// #ifdef SYSTEM_USE_FREERTOS
//     SemaphoreHandle_t I2cBusFreeMutex;  //< 互斥信号量来保护传输数据
// #endif
}I2c_t;

/**
 * @brief I2C初始化
 * @param[in]  obj          I2C对象
 * @param[in]  i2cId        I2C外设编号 @ref I2cId_t
 * @param[in]  scl          时钟线
 * @param[in]  sda          数据线
 * @return int8_t 
 * - @b Success : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_ALREADY_INIT - 已初始化
 * - @ref BSP_ERROR_INVALID_PARAM - 非法入参
 */
int8_t I2cInit( I2c_t *obj, I2cId_t i2cId, PinNames scl, PinNames sda );

/**
 * @brief I2C去初始化
 * @param  obj         I2C对象
 */
void I2cDeInit( I2c_t *obj );

/**
 * @brief I2C复位总线
 * @param  obj         I2C对象
 */
void I2cResetBus( I2c_t *obj );

/**
 * @brief 设置从机寻址地址位数
 * @param  obj         I2C对象
 * @param  addrSize    寻址地址位数 \n
 * @ref I2C_ADDR_SIZE_8 1个字节 \n
 * @ref I2C_ADDR_SIZE_16 2个字节
 */
void I2cSetRegAddrSize( I2c_t *obj, I2cRegAddrSize_t addrSize );

/**
 * @brief I2C写数据
 * @param[in]  obj          I2C对象
 * @param[in]  deviceAddr   从机设备地址
 * @param[in]  addr         从机寻址地址
 * @param[in]  buffer       写数据指针
 * @param[in]  size         写数据长度
 * @return int8_t 
 * - @b Success : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM
 * - @ref BSP_ERROR
 */
int8_t I2cWriteBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size );

/**
 * @brief I2C读数据
 * @param[in]  obj          I2C对象
 * @param[in]  deviceAddr   从机设备地址
 * @param[in]  addr         从机寻址地址
 * @param[in]  buffer       读取缓存
 * @param[in]  size         读取长度
 * @return int8_t 
 * - @b Success : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM
 * - @ref BSP_ERROR
 */
int8_t I2cReadBuffer( I2c_t *obj, uint8_t deviceAddr, uint16_t addr, uint8_t *buffer, uint16_t size );



#endif	 // __BSP_I2C_H 

/*********** (C) COPYRIGHT 2020 FiberHome *****END OF FILE****/
